import java.util.Iterator;

/**
 * 
 * @author David Schibl - 1125118
 * 
 *
 * @param <T> - Typ des Sets
 */
public class Set<T> implements java.lang.Iterable<T>{
	
	/*
	 * Implementierung des Sets als verkettete Liste.
	 * next verweisst aufs naechste Element
	 * Protected zwecks OrderedSet
	 */
	protected T element = null;
	protected Set<T> next =null;

	
	public Set(){
		
	}
	
	public Iterator<T> iterator(){
		return new SetIterator<T>(this);
	}
	
	public boolean insert(T add){
		//?
		if(element==add) return false;
		if(element==null){
			element=add;
			return true;
		}
		if(next==null){
			next = new Set<T>();	
		}
		
		return next.insert(add);
	}

	/**
	 * inner Class:
	 * Zur einfacheren Implementierung wird die Klasse SetIterator direkt
	 * in Set implementiert.
	 */
	public class SetIterator<E> implements Iterator<E>{
		private int count=0;
		private Set<E> start= null;
		
		public SetIterator(Set<E> temp){
			start=temp;
		}
		
		public boolean hasNext(){
			Set<E> temp=start;
			
			for(int i=0; i< count;i++){
				if(temp.next==null) return false;
				temp=temp.next;
			}
			return true;
			
		}
		public E next(){
			Set<E> temp=start;
			for(int i=0; i< count;i++){
				temp=temp.next;
			}
			count++;
			return temp.element;
		}
		public void remove(){
			
		}
	}
}
